/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package atualizaestoque;

import categoria.Categoria;
import controleFalta.ControleFalta;
import descricaoProduto.DescricaoProduto;
import detalhamentoEntrada.DetalhamentoEntrada;
import java.security.Principal;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import setor.Setor;
import subCategoria.SubCategoria;
import subSetor.SubSetor;

/**
 *
 * @author Alberto
 */
public class RepositorioAtualizaEstoque {

    public RepositorioAtualizaEstoque() { }
    
    /**
     * Método que irá atualizar o estoque quando houver entrada de material 
     * @param s
     * @param t 
     */
    public void atualizarEstoqueentrada(Session s, Transaction t, DetalhamentoEntrada objDetalhamentoEntrada){
        try{
            // Recuperando o objDescricooProduto
            DescricaoProduto objDescricaoProduto = objDetalhamentoEntrada.getDescricaoProduto();

            int qtdAntigaDescricaoProduto = objDescricaoProduto.getControleFalta().getQuantidadeAtual();

            // Realizando a soma entre a quandtidade que foi feita a entrada e a quantiade em estoque
            int qtQtdAtual = qtdAntigaDescricaoProduto + objDetalhamentoEntrada.getQtdProduto();

            ControleFalta objControlefalta = objDescricaoProduto.getControleFalta();

            // Setando esta nova quandidade
            objControlefalta.setQuantidadeAtual(qtQtdAtual);

            // Verificando se a quantidade minima ainda é maior que a quantidade atual
            if(objControlefalta.getQuantidadeAtual() > objControlefalta.getQuantidadeMinima())
                objControlefalta.setRepor(false);// Caso a quantidade atual for maior que a qtd minima seto o status repor pra false

            // salvando o objDescricaoProduto com a qtd armazenada atualizada
            s.saveOrUpdate(objControlefalta);

            // Recuperando a subcategoria da base
            SubCategoria objSubCategoria = (SubCategoria) s.get(SubCategoria.class, objDescricaoProduto.getobjSubCategoria().getIdSubCategoria());

            // Recuperando a categoria 
            Categoria objCategoria = objSubCategoria.getCategoria();

            // Recuperando o SubSetor
            SubSetor objSubSetor = (SubSetor) s.get(SubSetor.class, objCategoria.getSubSetor().getIdSubSetor());

            // Recuperando a quantidade anterior do subsetor
            int qtdAnteriorSubSetor = objSubSetor.getQuantidadeArmazenada();

            // SomanDo a quantidade do subSetor
            int qtdAtualSubSetor = (objSubSetor.getQuantidadeArmazenada() - qtdAntigaDescricaoProduto) +  qtQtdAtual;

            // setando a nova qtd
            objSubSetor.setQuantidadeArmazenada(qtdAtualSubSetor);

            // Atualizando a base
            s.saveOrUpdate(objSubSetor);

            // Recuperando o objeto Setor
            Setor objSetor = (Setor) s.get(Setor.class, objSubSetor.getSetor().getIdSetor());

            // Calculando a qtd atual do setor
            int qtdAtualSetor = (objSetor.getQuantidadeArmazenada() - qtdAnteriorSubSetor) + qtdAtualSubSetor;

            // setando essa qtd
            objSetor.setQuantidadeArmazenada(qtdAtualSetor);

            // salvando o setor na base.
            s.saveOrUpdate(objSetor);
            
            // limpando a seção
        }catch(Exception e){
            System.out.println("Teste " + e.getMessage());
        }

    }
    
    
    /**
     * Método que irá atualizar o estoque quando houver um cancelamento da entrada de material 
     * @param s
     * @param t 
     */
    public void atualizarEstoqueCancelamentoEntrada(Session s, Transaction t, DetalhamentoEntrada objDetalhamentoEntrada){
        try{
            // Recuperando o objDescricooProduto
            DescricaoProduto objDescricaoProduto = objDetalhamentoEntrada.getDescricaoProduto();

            int qtdAntigaDescricaoProduto = objDescricaoProduto.getControleFalta().getQuantidadeAtual();

            // Realizando a soma entre a quandtidade que foi feita a entrada e a quantiade em estoque
            int qtQtdAtual = qtdAntigaDescricaoProduto - objDetalhamentoEntrada.getQtdProduto();

            ControleFalta objControlefalta = objDescricaoProduto.getControleFalta();

            // Setando esta nova quandidade
            objControlefalta.setQuantidadeAtual(qtQtdAtual);

            // Verificando se a quantidade minima ainda é maior que a quantidade atual
            if(objControlefalta.getQuantidadeMinima() > objControlefalta.getQuantidadeAtual())
                objControlefalta.setRepor(true);// Caso a quantidade atual for maior que a qtd minima seto o status repor pra false

            // salvando o objDescricaoProduto com a qtd armazenada atualizada
            s.saveOrUpdate(objControlefalta);

            // Recuperando a subcategoria da base
            SubCategoria objSubCategoria = (SubCategoria) s.get(SubCategoria.class, objDescricaoProduto.getobjSubCategoria().getIdSubCategoria());

            // Recuperando a categoria 
            Categoria objCategoria = objSubCategoria.getCategoria();

            // Recuperando o SubSetor
            SubSetor objSubSetor = (SubSetor) s.get(SubSetor.class, objCategoria.getSubSetor().getIdSubSetor());

            // Recuperando a quantidade anterior do subsetor
            int qtdAnteriorSubSetor = objSubSetor.getQuantidadeArmazenada();

            // SomanDo a quantidade do subSetor
            int qtdAtualSubSetor = (objSubSetor.getQuantidadeArmazenada() - qtdAntigaDescricaoProduto) +  qtQtdAtual;

            // setando a nova qtd
            objSubSetor.setQuantidadeArmazenada(qtdAtualSubSetor);

            // Atualizando a base
            s.saveOrUpdate(objSubSetor);

            // Recuperando o objeto Setor
            Setor objSetor = (Setor) s.get(Setor.class, objSubSetor.getSetor().getIdSetor());

            // Calculando a qtd atual do setor
            int qtdAtualSetor = (objSetor.getQuantidadeArmazenada() - qtdAnteriorSubSetor) + qtdAtualSubSetor;

            // setando essa qtd
            objSetor.setQuantidadeArmazenada(qtdAtualSetor);

            // salvando o setor na base.
            s.saveOrUpdate(objSetor);
            
            // limpando a seção
        }catch(Exception e){
            System.out.println("Teste " + e.getMessage());
        }
    }
    
    
    public void atualizarEstoquePorDescricaoProduto(Session s, Transaction t, DescricaoProduto objDescricaoProduto){
        try{
           
            // Recuperando a subcategoria da base
            SubCategoria objSubCategoria = objDescricaoProduto.getobjSubCategoria();

            // Recuperando a categoria 
            Categoria objCategoria = objSubCategoria.getCategoria();

            // Recuperando o SubSetor
            SubSetor objSubSetor = objCategoria.getSubSetor();

            // SomanDo a quantidade do subSetor
            int qtdAtualSubSetor = 0;

            // setando a nova qtd
            objSubSetor.setQuantidadeArmazenada(qtdAtualSubSetor);
            
            // Recuperando o id do subsetor
            int idSubsetor = objSubSetor.getIdSubSetor();
            // Atualizar Banco
            Query q = s.createQuery("select atualizaBanco("+idSubsetor+")");
           
            // execultadno a query
            q.executeUpdate();
            
        }catch(Exception e){
            e.printStackTrace();
            System.out.println("Teste " + e.getMessage());
        }
    }
    
}
